#pragma
#include<iostream>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
const char* root = "/";
const char* dev_null = "/dev/null";
//提供变成守护进程的方法
void Daemon(bool inchdir,bool isclose)
{
    //1. 忽略不要的信号
    signal(SIGCHLD,SIG_IGN);
    signal(SIGPIPE,SIG_IGN);

    //2. fork() 组长无法成为守护进程
    if(fork()> 0)
    {
        exit(1);//关闭父进程
    }

    //3. setid :设置让自己成为一个新的会话，后面的代码是子进程在走
    setsid();
    //4. 确认是否更改目录:每一个进程都有自己的CWD，是否将当前进程的CWD 更改成为/根目录
    if(inchdir)
        chdir(root);
    //5. 对012 进行重定向
    if(isclose)
    {
        close(0);
        close(1);
        close(2);
    }
    else
    {
        int fd = open(dev_null,O_RDWR);
        if(fd > 0)
        {
            dup2(fd,0);//任何针对标准输入的操作，都会作用与fd
            dup2(fd,1);
            dup2(fd,2);
            close(fd);
        }
    }
}